// EquipCompositeController.java
package com.geek.hero.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.geek.hero.entity.Equip;
import com.geek.hero.entity.EquipComposite;
import com.geek.hero.result.Result;
import com.geek.hero.service.IEquipCompositeService;
import com.geek.hero.service.IEquipService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * 装备合成关系表 前端控制器
 * </p>
 *
 * @author author
 * @since 2025-09-14
 */
@RestController
@RequestMapping("/equip-composite")
@CrossOrigin
public class EquipCompositeController {

    // 注入装备合成关系服务
    @Autowired
    private IEquipCompositeService equipCompositeService;

    // 注入装备服务
    @Autowired
    private IEquipService equipService;

    /**
     * 获取所有装备合成关系（基础信息）
     * 请求路径: GET /equip-composite
     * @return Result 包含所有装备合成关系的基础信息
     */
    @GetMapping
    public Result getAllEquipComposites() {
        List<EquipComposite> list = equipCompositeService.list();
        return new Result(true, "查询成功", list);
    }

    /**
     * 获取所有装备合成关系（详细信息）
     * 请求路径: GET /equip-composite/details
     * @return Result 包含所有装备合成关系的详细信息，包括合成装备和基础装备的详细数据
     */
    @GetMapping("/details")
    public Result getAllEquipCompositesWithDetails() {
        // 获取所有装备合成关系
        List<EquipComposite> composites = equipCompositeService.list();

        // 为每个合成关系添加详细信息
        List<Map<String, Object>> detailedResults = new ArrayList<>();
        for (EquipComposite composite : composites) {
            Map<String, Object> result = new HashMap<>();

            // 获取合成装备的详细信息
            Equip compositeEquip = null;
            if (composite.getId() != null) {
                compositeEquip = equipService.getById(composite.getId());
            }

            // 获取基础装备1的详细信息
            Equip baseEquip1 = null;
            if (composite.getBaseId1() != null) {
                baseEquip1 = equipService.getById(composite.getBaseId1());
            }

            // 获取基础装备2的详细信息
            Equip baseEquip2 = null;
            if (composite.getBaseId2() != null) {
                baseEquip2 = equipService.getById(composite.getBaseId2());
            }

            // 构造包含详细信息的结果
            result.put("compositeInfo", composite);  // 合成关系基本信息
            result.put("compositeEquip", compositeEquip);  // 合成后的装备信息
            result.put("baseEquip1", baseEquip1);  // 基础装备1信息
            result.put("baseEquip2", baseEquip2);  // 基础装备2信息

            detailedResults.add(result);
        }

        return new Result(true, "查询成功", detailedResults);
    }

    /**
     * 根据名称搜索装备合成关系（详细信息）
     * 请求路径: GET /equip-composite/search?keyword=关键字
     * @param keyword 搜索关键字
     * @return Result 包含匹配的装备合成关系详细信息
     */
    @GetMapping("/search")
    public Result searchEquipComposites(@RequestParam String keyword) {
        // 先搜索匹配的装备（根据装备名称模糊匹配）
        List<Equip> matchedEquips = equipService.list(
                new QueryWrapper<Equip>().like("name", keyword)
        );

        // 收集匹配的装备ID
        List<Integer> matchedEquipIds = new ArrayList<>();
        for (Equip equip : matchedEquips) {
            matchedEquipIds.add(equip.getId());
        }

        // 如果没有匹配的装备，返回空结果
        if (matchedEquipIds.isEmpty()) {
            return new Result(true, "查询成功", new ArrayList<>());
        }

        // 根据匹配的装备ID搜索合成关系
        // 查询条件：合成装备ID、基础装备1ID或基础装备2ID在匹配的装备ID列表中
        List<EquipComposite> composites = equipCompositeService.list(
                new QueryWrapper<EquipComposite>()
                        .in("id", matchedEquipIds)
                        .or()
                        .in("base_id_1", matchedEquipIds)
                        .or()
                        .in("base_id_2", matchedEquipIds)
        );

        // 为每个匹配的合成关系添加详细信息
        List<Map<String, Object>> detailedResults = new ArrayList<>();
        for (EquipComposite composite : composites) {
            Map<String, Object> result = new HashMap<>();

            // 获取合成装备的详细信息
            Equip compositeEquip = null;
            if (composite.getId() != null) {
                compositeEquip = equipService.getById(composite.getId());
            }

            // 获取基础装备1的详细信息
            Equip baseEquip1 = null;
            if (composite.getBaseId1() != null) {
                baseEquip1 = equipService.getById(composite.getBaseId1());
            }

            // 获取基础装备2的详细信息
            Equip baseEquip2 = null;
            if (composite.getBaseId2() != null) {
                baseEquip2 = equipService.getById(composite.getBaseId2());
            }

            // 构造包含详细信息的结果
            result.put("compositeInfo", composite);  // 合成关系基本信息
            result.put("compositeEquip", compositeEquip);  // 合成后的装备信息
            result.put("baseEquip1", baseEquip1);  // 基础装备1信息
            result.put("baseEquip2", baseEquip2);  // 基础装备2信息

            detailedResults.add(result);
        }

        return new Result(true, "查询成功", detailedResults);
    }

    /**
     * 根据合成装备ID获取详细信息
     * 请求路径: GET /equip-composite/{id}
     * @param id 合成装备ID
     * @return Result 包含指定合成关系的详细信息
     */
    @GetMapping("/{id}")
    public Result getEquipCompositeById(@PathVariable Integer id) {
        // 根据ID获取合成关系
        EquipComposite composite = equipCompositeService.getById(id);

        // 如果未找到对应合成关系，返回错误信息
        if (composite == null) {
            return new Result(false, "该基础装备无法合成");
        }

        // 构建包含详细信息的结果
        Map<String, Object> result = new HashMap<>();

        // 获取合成装备的详细信息
        Equip compositeEquip = null;
        if (composite.getId() != null) {
            compositeEquip = equipService.getById(composite.getId());
        }

        // 获取基础装备1的详细信息
        Equip baseEquip1 = null;
        if (composite.getBaseId1() != null) {
            baseEquip1 = equipService.getById(composite.getBaseId1());
        }

        // 获取基础装备2的详细信息
        Equip baseEquip2 = null;
        if (composite.getBaseId2() != null) {
            baseEquip2 = equipService.getById(composite.getBaseId2());
        }

        // 构造包含详细信息的结果
        result.put("compositeInfo", composite);  // 合成关系基本信息
        result.put("compositeEquip", compositeEquip);  // 合成后的装备信息
        result.put("baseEquip1", baseEquip1);  // 基础装备1信息
        result.put("baseEquip2", baseEquip2);  // 基础装备2信息

        return new Result(true, "查询成功", result);
    }

    /**
     * 获取所有装备合成关系列表
     * 请求路径: GET /equip-composite/list
     * @return Result 包含所有装备合成关系列表
     */
    @GetMapping("/list")
    public Result list() {
        List<EquipComposite> list = equipCompositeService.list();
        return new Result(true, "查询成功", list);
    }
}
